package com.sheliduan.itlearning.common.domain.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sheliduan.itlearning.common.domain.dos.UserDO;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.Objects;

/**
 * @author: 断舍离
 * @date: 2025/1/22 9:35
 * @description: 用户映射接口
 **/
public interface UserMapper extends BaseMapper<UserDO> {

    /*
     * 根据用户角色和查询条件分页查询用户数据
     * */
    default Page<UserDO> selectPageList(long current, long size, String role, String username, LocalDateTime startDate, LocalDateTime endDate) {
        // MyBatis分页对象, 需传入当前页码和每页记录数
        Page<UserDO> page = new Page<>(current, size);
        LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserDO::getRole, role)
                .like(StringUtils.isNotBlank(username), UserDO::getUsername, username.trim())
                .ge(Objects.nonNull(startDate), UserDO::getCreateTime, startDate) // 大于等于 startDate
                .le(Objects.nonNull(endDate), UserDO::getCreateTime, endDate) // 小于等于 endDate
                .orderByDesc(UserDO::getCreateTime);
        return selectPage(page, wrapper);
    }

    /*
    * 根据用户名查找用户
    * */
    default UserDO findUserByUsername(String username) {
        // 创建查询对象wrapper
        LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
        // 构造查询条件, eq判断等值
        wrapper.eq(UserDO::getUsername, username);
        return selectOne(wrapper);
    }

    /*
     * 根据用户名和角色查找用户
     * 登录时, 不能只判断用户名, 还需要判断其选择的角色是否对应数据库中保存的
     * */
    default UserDO findUserByUsernameAndRole(String username, String role) {
        LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserDO::getUsername, username);
        wrapper.eq(UserDO::getRole, role);
        return selectOne(wrapper);
    }

    /*
     * 根据用户id修改用户信息
     * */
    default int updateUserInfoById(Integer id, String username, String avatar){
        LambdaUpdateWrapper<UserDO> wrapper = new LambdaUpdateWrapper<>();
        wrapper.set(UserDO::getUsername, username);
        wrapper.set(UserDO::getAvatar, avatar);
        wrapper.set(UserDO::getUpdateTime, new Date());
        wrapper.eq(UserDO::getId, id);
        return update(null, wrapper);
    }

    /*
     * 根据用户id修改用户信息(管理员用的)
     * */
    default int updateUser(Integer id, String username, String avatar, String password){
        LambdaUpdateWrapper<UserDO> wrapper = new LambdaUpdateWrapper<>();
        wrapper.set(UserDO::getUsername, username);
        wrapper.set(UserDO::getAvatar, avatar);
        if(!StringUtils.isBlank(password)) {
            wrapper.set(UserDO::getPassword, password);
        }
        wrapper.set(UserDO::getUpdateTime, new Date());
        wrapper.eq(UserDO::getId, id);
        return update(null, wrapper);
    }

    /*
     * 根据用户名修改用户密码
     * */
    default int updatePasswordByUsername(String username, String password){
        LambdaUpdateWrapper<UserDO> wrapper = new LambdaUpdateWrapper<>();
        // 设置要更新的字段
        wrapper.set(UserDO::getPassword, password);
        wrapper.set(UserDO::getUpdateTime, new Date());
        // 更新条件
        wrapper.eq(UserDO::getUsername, username);
        return update(null, wrapper);
    }
}
